home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / qwrite11.arc / QWRITE.INC < prev    next >
Encoding:
Text File  |  1986-10-30  |  9.6 KB  |  139 lines

  1. { This procedure does fast screen writes and automatically configures to
  2.   your machine for Mono, CGA, and EGA.  It also has the feature of suppressing
  3.   the attribute by setting Attr<0; then Qwrite will just overwrite the display
  4.   using the current attributes.  The upper left column is 1,1. }
  5.  
  6. type Str80 = string[80];
  7.  
  8. procedure Qwrite (Row, Col: byte; Attr: integer; St: Str80);
  9. begin
  10. Inline(
  11.   $1E                    {       PUSH  DS               ;Save Turbo's DS}
  12.   /$31/$C0               {       XOR   AX,AX            ;Set AX=0}
  13.   /$89/$C1               {       MOV   CX,AX            ;Set CX=0}
  14.   /$8E/$C0               {       MOV   ES,AX            ;Set ES=0}
  15.   /$8A/$A6/>ROW          {       MOV   AH,[BP+>Row]     ;Move row (Row*256)}
  16.   /$D1/$E8               {       SHR   AX,1             ;(Row*128)}
  17.   /$89/$C7               {       MOV   DI,AX            ;Save (Row*128) in DI}
  18.   /$D1/$E8               {       SHR   AX,1             ;(Row*64)}
  19.   /$D1/$E8               {       SHR   AX,1             ;(Row*32)}
  20.   /$01/$C7               {       ADD   DI,AX            ;Save (Row*160) in DI}
  21.   /$8B/$86/>COL          {       MOV   AX,[BP+>Col]     ;Move col}
  22.   /$48                   {       DEC   AX               ;Convert to 0-79 range}
  23.   /$D1/$E0               {       SHL   AX,1             ;Mult by 2}
  24.   /$01/$C7               {       ADD   DI,AX            ;Offset calc'd in DI}
  25.                          {                              ;}
  26.   /$8B/$9E/>ATTR         {       MOV   BX,[BP+>Attr]    ;Move attr}
  27.                          {                              ;}
  28.   /$8D/$B6/>ST           {       LEA   SI,[BP+>St]      ;Place offset in SI}
  29.   /$8C/$D0               {       MOV   AX,SS            ;Move SS into DS for}
  30.   /$8E/$D8               {       MOV   DS,AX            ;  use by LODS}
  31.                          {                              ;}
  32.   /$FC                   {       CLD                    ;Set DF to increment}
  33.   /$AD                   {       LODSW                  ;Load St[1],St[0]}
  34.   /$00/$C1               {       ADD   CL,AL            ;Save length in CL}
  35.   /$74/$41               {       JZ    ExitS            ;Null string}
  36.   /$88/$E0               {       MOV   AL,AH            ;Move St[1] to AL}
  37.   /$26/$80/$3E/$49/$04/$07{      ES: CMP BY[$0449],$07  ;Check video mode}
  38.   /$75/$39               {       JNE   Color            ;  use Color routine}
  39.                          {                              ;}
  40.   /$BA/$F6/$AF           {       MOV   DX,$AFF6         ;Addr for Mono}
  41.   /$8E/$C2               {       MOV   ES,DX            ;ES:DI dest pointer}
  42.   /$84/$FF               {EGA:   TEST  BH,BH            ;If Attr<0 ...}
  43.   /$78/$18               {       JS    Mono1            ;  use char only}
  44.                          {                              ;}
  45.                          {; -- Mono routine; Attr, Char and No Wait--}
  46.   /$88/$DC               {       MOV   AH,BL            ;Copy attr to AH}
  47.   /$41                   {Mono2: INC   CX               ;Bump CX for odd char}
  48.   /$D1/$E9               {       SHR   CX,1             ;Divide counter by 2}
  49.                          {                              ; CF=0 if odd length}
  50.   /$EB/$08               {       JMP   SHORT Mon2b      ;Jump into mono loop}
  51.                          {                              ;}
  52.   /$AD                   {Mon2a: LODSW                  ;Load TWO char}
  53.   /$88/$E7               {       MOV   BH,AH            ;Move Ch2 to BH}
  54.   /$88/$DC               {       MOV   AH,BL            ;Copy attr to AH}
  55.   /$AB                   {       STOSW                  ;To dest & inc DI 2}
  56.   /$88/$F8               {       MOV   AL,BH            ;Move Ch2 to AL}
  57.   /$AB                   {Mon2b: STOSW                  ;To dest & inc DI 2}
  58.   /$E2/$F5               {       LOOP  Mon2a            ;Loop until CX=0}
  59.   /$73/$75               {       JNC   Exit             ;Exit if odd length}
  60.   /$AC                   {       LODSB                  ;Load last char}
  61.   /$AB                   {       STOSW                  ;To dest & inc DI 2}
  62.   /$EB/$71               {       JMP   SHORT Exit       ;Done}
  63.                          {                              ;}
  64.                          {; -- Mono routine; Char Only and No Wait--}
  65.   /$41                   {Mono1: INC   CX               ;Bump CX for odd char}
  66.   /$89/$CA               {       MOV   DX,CX            ;Save CX in DX}
  67.   /$D1/$E9               {       SHR   CX,1             ;Divide counter by 2}
  68.   /$EB/$05               {       JMP   SHORT Mon1b      ;Jump into mono loop}
  69.                          {                              ;}
  70.   /$AD                   {Mon1a: LODSW                  ;Load TWO char}
  71.   /$AA                   {       STOSB                  ;To dest & inc DI 1}
  72.   /$47                   {       INC   DI               ;Pass up attr}
  73.   /$88/$E0               {       MOV   AL,AH            ;Move Ch2 to AL}
  74.   /$AA                   {Mon1b: STOSB                  ;To dest & inc DI 1}
  75.   /$47                   {       INC   DI               ;Pass up attr}
  76.   /$E2/$F7               {       LOOP  Mon1a            ;Loop until CX=0}
  77.   /$D1/$EA               {       SHR   DX,1             ;Divide counter by 2}
  78.                          {                              ;CF=0 if odd length}
  79.   /$73/$5D               {       JNC   Exit             ;Exit if odd length}
  80.   /$AC                   {       LODSB                  ;Load last char}
  81.   /$AA                   {       STOSB                  ;To dest & inc DI 1}
  82.   /$EB/$59               {ExitS: JMP   SHORT Exit       ;Done}
  83.                          {                              ;}
  84.   /$BA/$F6/$B7           {Color: MOV   DX,$B7F6         ;Addr for Color}
  85.   /$8E/$C2               {       MOV   ES,DX            ;ES:DI dest pointer}
  86.   /$79/$C5               {       JNS   EGA              ;If EGA, do Mono}
  87.   /$BA/$DA/$03           {       MOV   DX,$03DA         ;CGA port}
  88.   /$84/$FF               {       TEST  BH,BH            ;If Attr<0 ...}
  89.   /$78/$2A               {       JS    Col1b            ;  use char only}
  90.   /$88/$DC               {       MOV   AH,BL            ;Move attr in AH}
  91.   /$EB/$01               {       JMP   SHORT Col2b      ;Attr and char}
  92.                          {                              ;}
  93.                          {; -- Color routine; Attr, Char and Wait --}
  94.   /$AC                   {Col2a: LODSB                  ;Load source char}
  95.   /$88/$C7               {Col2b: MOV   BH,AL            ;Save char in BH}
  96.   /$FA                   {       CLI                    ;Disable interrupts}
  97.   /$EC                   {E4in2: IN    AL,DX            ;Check CGA status}
  98.   /$A8/$08               {       TEST  AL,$08           ;If #3 bit clear ...}
  99.   /$74/$0A               {       JZ    Col2c            ;  skip tests}
  100.   /$88/$F8               {       MOV   AL,BH            ;Move char back in AL}
  101.   /$81/$F9/$90/$00       {       CMP   CX,$0090         ;If <145 Cols left,}
  102.   /$78/$AF               {       JS    Mono2            ;  do mono instead}
  103.   /$EB/$0B               {       JMP   SHORT Col2d      ;  else store direct}
  104.   /$D0/$D8               {Col2c: RCR   AL,1             ;If #0 bit set ...}
  105.   /$72/$ED               {       JC    E4in2            ;  try again for $E4}
  106.   /$EC                   {E5in2: IN    AL,DX            ;Check CGA status}
  107.   /$D0/$D8               {       RCR   AL,1             ;If #0 bit clear ...}
  108.   /$73/$FB               {       JNC   E5in2            ;  try again for $E5}
  109.   /$88/$F8               {       MOV   AL,BH            ;Move char back in AL}
  110.   /$AB                   {Col2d: STOSW                  ;Put in dest & inc DI}
  111.   /$FB                   {       STI                    ;Enable interrupts}
  112.   /$E2/$DE               {       LOOP  Col2a            ;Loop till CX=0}
  113.   /$EB/$23               {       JMP   SHORT Exit       ;Done}
  114.                          {                              ;}
  115.                          {; -- Color routine; Char only and Wait --}
  116.   /$AC                   {Col1a: LODSB                  ;Load source char}
  117.   /$47                   {       INC   DI               ;Pass up attr}
  118.   /$88/$C7               {Col1b: MOV   BH,AL            ;Save char in BH}
  119.   /$FA                   {       CLI                    ;Disable interrupts}
  120.   /$EC                   {E4in1: IN    AL,DX            ;Check CGA status}
  121.   /$A8/$08               {       TEST  AL,$08           ;If #3 bit clear ...}
  122.   /$74/$0A               {       JZ    Col1c            ;  skip tests}
  123.   /$88/$F8               {       MOV   AL,BH            ;Move char back in AL}
  124.   /$81/$F9/$80/$00       {       CMP   CX,$0080         ;If <129 Cols left,}
  125.   /$78/$A0               {       JS    Mono1            ;  do mono instead.}
  126.   /$EB/$0B               {       JMP   SHORT Col1d      ;  else store direct}
  127.   /$D0/$D8               {Col1c: RCR   AL,1             ;If #0 bit set ...}
  128.   /$72/$ED               {       JC    E4in1            ;  try again for $E4}
  129.   /$EC                   {E5in1: IN    AL,DX            ;Check CGA status}
  130.   /$D0/$D8               {       RCR   AL,1             ;If #0 bit clear ...}
  131.   /$73/$FB               {       JNC   E5in1            ;  try again for $E5}
  132.   /$88/$F8               {       MOV   AL,BH            ;Move char back in AL}
  133.   /$AA                   {Col1d: STOSB                  ;Put in dest & inc DI}
  134.   /$FB                   {       STI                    ;Enable interrupts}
  135.   /$E2/$DD               {       LOOP  Col1a            ;Loop till CX=0}
  136.                          {                              ;}
  137.   /$1F                   {Exit:  POP   DS               ;Restore Turbo's DS}
  138. );
  139. end;